package com.kk.datastructure.sort;
import java.util.Arrays;
import java.util.Date;

/**
 * title: 简单插入排序
 * @author 阿K
 * 2020年12月8日 下午10:38:05 
 */
public class InsertSort {

	public static void main(String[] args) {
//		int[] arr = {101, 34, 119, 1, -1, 89}; 
//		insertSort(arr);
//		System.out.println(Arrays.toString(arr));

		// 创建要给80000个的随机的数组
		int[] arr = new int[80000];
		for (int i = 0; i < arr.length; i++) {
			arr[i] = (int) (Math.random() * 8000000);
		}
		new InsertSort(arr);
	}

	//
	public InsertSort(int[] arr) {
		long time = new Date().getTime();
		insertSort(arr);
		long time2 = new Date().getTime();
		System.out.println("使用了：" + (time2 - time) + "毫秒");
	}

	// 直接插入排序 Api
	public static void insertSort(int[] arr) {
		int insertVal = 0;
		int insertIndex = 0;
		for (int i = 1; i < arr.length; i++) {
			// 定义待插入的数
			insertVal = arr[i];
			// 即arr[1]的前面这个数的下标
			insertIndex = i - 1;

			// 给insertVal 寻找到插入的位置
			// 说明
			// 1. insertIndex >= 0 保证在给insertVal 找插入位置，不越界
			// 2. insertVal < arr[insertIndex] 待插入的数，还没有找到插入位置
			// 3. 就需要将 arr[insertIndex] 后移
			while (insertIndex >= 0 && insertVal < arr[insertIndex]) {
				arr[insertIndex + 1] = arr[insertIndex];
				insertIndex--;
			}

			// 当退出while循环时，说明插入的位置找到, insertIndex + 1
			// 判断是否需要赋值
			if (insertIndex + 1 != i) {
				arr[insertIndex + 1] = insertVal;
			}
		}
	}

}
